package com.yy.base.util.excel;

import com.yy.base.exception.BaseException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class ParseExcel2003 {
	private boolean parseAll = false;
	private List<String[]> result = new ArrayList<String[]>();
	/**
	 * 默认的空行判断指标：在“连续多行为空则认为文件结束”策略中使用该指标。
	 */
	private static int EMPTY_LINE_COUNT_FOR_ESCAPE = 10;
	
	/**
	 * 解析excel2003
	 */
	public List<String[]> parseExcel(File file) {
		Workbook workBook = null;
		FileInputStream ins = null;
		try {
			//2003版本
			ins = new FileInputStream(file);
			workBook = Workbook.getWorkbook(ins);
			
			parse(workBook, null, 0);
		} catch (Exception e) {
			throw new BaseException(e);
		} finally {
			try {
				if (ins != null) {
					ins.close();
				}
			} catch (Exception e) {
			}
		}
		return result;
	}

	/**
	 * 解析excel2003
	 */
	public List<String[]> parseExcel(InputStream ins) {
		Workbook workBook = null;
		try {
			//2003版本
			workBook = Workbook.getWorkbook(ins);

			parse(workBook, null, 0);
		} catch (Exception e) {
			throw new BaseException(e);
		} finally {
			try {
				if (ins != null) {
					ins.close();
				}
			} catch (Exception e) {
			}
		}
		return result;
	}

	/**
	 * 是否解析所有sheet
	 */
	public void setParseAllSheet(boolean bool) {
		this.parseAll = bool;
	}
	
	private void parse(Workbook workBook, String endTag, int headerLineAsBegin) {
		if (workBook == null) {
			throw new BaseException("读取文件失败！请确认是否是有效的excel文件");
		}
		if (parseAll) {
			Sheet []sheets = workBook.getSheets();
			for (int i = 0; i < sheets.length; i++) {
				parse(sheets[i], endTag, headerLineAsBegin);
			}
		} else {
			parse(workBook.getSheet(0), endTag, headerLineAsBegin);
		}
	}
	
	/**
	 * 从Workbook中指定的sheet读取对象列表。
	 */
	private void parse(Sheet sheet, String endTag, int headerLineAsBegin) {
		// 使用“连续多行为空标记”，对数据读取的行数进行控制，若连续多行为空的情况，达到默认指定的行数，则认为数据读取已经结束。
		int emptyLineCount = 0;
		Cell[] cells = null;
		for (int i = headerLineAsBegin; i < sheet.getRows(); i++) {
			cells = sheet.getRow(i);
			// 如果读到空行，表示sheet数据区已经结束
			if (cells == null) {
				break;
			}
			// 如果读到一行cells长度为0，表示本行没数据。
			if (cells.length == 0) {
				// 本行数据为空时，空行计数器刷新，并进行连续空行退出判断
				emptyLineCount++;
				if (emptyLineCount >= EMPTY_LINE_COUNT_FOR_ESCAPE) {
					break;
				}
				continue;
			}
			// 如果用户定义了结束符，则使用结束符对文件数据区进行判断
			if (!StringUtils.isEmpty(endTag) && endTag.equals(cells[0].getContents())) {
				break;
			}
			String[] data = new String[cells.length];
			// 本行数据是否为空的标记，如果所有cell的内容都是null或“”，则认为本行数据为空。
			boolean isEmpty = true;
			for (int c = 0;c < cells.length;c ++) {
				data[c] = cells[c].getContents();
				if (!StringUtils.isEmpty(data[c])) {
					isEmpty = false;
				}
			}
			if (isEmpty) {
				// 本行数据为空时，空行计数器刷新，并进行连续空行退出判断
				emptyLineCount++;
				if (emptyLineCount >= EMPTY_LINE_COUNT_FOR_ESCAPE) {
					break;
				}
				continue;
			}
			emptyLineCount = 0;
			
			result.add(data);
		}
	}
}